package model;

import java.util.ArrayList;
import java.util.HashMap;

import exceptions.AttrBestaatInAttrGroepException;
import exceptions.AttribuutBestaatException;
import exceptions.AttribuutGroepNaamBestaatInAttribuutGroepenException;
import exceptions.AttribuutLijstLeegException;
import exceptions.AttribuutNaamKomtNietVoorInPrimaireSleutelException;
import exceptions.BuitenlandseSleutelVerwijstNaarNietBestaandRecordException;
import exceptions.DatabankBestaatNietException;
import exceptions.FilterIsLeegException;
import exceptions.GeenAttributenException;
import exceptions.GeenKolomNamenException;
import exceptions.GeenDatabankConnectie;
import exceptions.GeenPrimaireSleutelException;
import exceptions.GeenTabelException;
import exceptions.GroepNaamException;
import exceptions.NulOnbekendException;
import exceptions.PrimaireSleutelDuplicaatException;
import exceptions.PrimaireSleutelLijstLeegException;
import exceptions.PrimaireSleutelNaamException;
import exceptions.RecordWaardeNietGevondenException;
import exceptions.ReferentieBestaatException;
import exceptions.ReferentieBestaatNietException;
import exceptions.TabelBestaatException;
import exceptions.TabelBestaatNietException;
import exceptions.AttribuutBestaatNietException;
import exceptions.GeenDatabankConnectie;
import exceptions.LijstenNietEvenLangException;
import exceptions.PrimaireSleutelAttribuutNamenException;
import exceptions.RecordWaardeIsLeegException;
import exceptions.RecordWaardeMagNietLeegZijn;
import exceptions.SoortIncorrectException;
import exceptions.SoortOnbekendException;
import exceptions.TabelBestaatNietException;
import exceptions.TabelNaamException;


public interface RDBMS {
	
	//DDL
	void createDatabank(String databankNaam) throws Exception;
	
	/**
	 * Methode om een Tabel exclusief buitenlandsesleutel toe te voegen aan een databank
	 * @param tabelNaam
	 * @param attributen
	 * @param primaireSleutel
	 * @param primaireSleutelNaam
	 * @throws Exception
	 */
	void createTabel(String tabelNaam, ArrayList<ArrayList<String>> attributen, ArrayList<String> primaireSleutel, String primaireSleutelNaam) throws Exception;
	
	/**
	 * Methode om een Tabel inclusief buitenlandsesleutel toe te voegen aan een databank
	 * @param tabelNaam
	 * @param attributen
	 * @param primaireSleutel
	 * @param primaireSleutelNaam
	 * @param groepNaam
	 * @param primKey
	 * @param naartoeTabel
	 * @param attrNaarToe
	 * @throws ReferentieBestaatException 
	 * @throws AttrBestaatInAttrGroepException 
	 * @throws AttribuutBestaatNietException 
	 * @throws GroepNaamException 
	 * @throws GeenTabelException 
	 * @throws GeenAttributenException 
	 * @throws Exception
	 */
	//void createTabel(String tabelNaam, ArrayList<ArrayList<String>> attributen, ArrayList<String> primaireSleutel, String primaireSleutelNaam, String groepNaam, PrimaireSleutel primKey, Tabel naartoeTabel, ArrayList<String> attrNaarToe) throws Exception;
	//void toevoegenBuitenlandseSleutel(String groepNaam, PrimaireSleutel primaireSleutel, Tabel naartoeTabel, ArrayList<String> attributenNaartoe) throws Exception;
	void toevoegenBuitenlandseSleutel2(String groepNaam, Tabel vanTabel, Tabel naarTabel, String[] attributenVanaf) throws AttribuutBestaatNietException, AttrBestaatInAttrGroepException, ReferentieBestaatException, GroepNaamException, GeenTabelException, GeenAttributenException;
	void connectDatabank(String databankNaam) throws Exception;
	void disconnectDatabank();
	void veranderTabel(String tabelNaam, String colomNaam, Datatypen datatype);
	void veranderTabel(String tabelNaam, String colomNaam);
	void verwijderTabel(String tabelNaam) throws Exception;
	void verwijderDatabank(String databankNaam) throws Exception;
	String toonTabellen() throws Exception;

	//DML
	void toevoegen(String tabelNaam, String[] namen, String[] waardes) throws Exception;
	void verwijderen(String tabelNaam, String colomNaam, String deleteWaarde) throws Exception;
	void update(String tabelNaam, String[] namen, String[] waardes, String filterKey, String filterValue) throws Exception;
	String selecteren(ArrayList<String> colomNaam, String tabelNaam, String filterKey, String filterValue) throws Exception;
}
